0.1 Load all of the throw data

#load omnibus dataframe
omnibus_df <- read_delim("../data/processed/omnibus/omnibus_raw.csv", 
                            delim = ",", 
                            col_types = cols(.default = col_double(), 
                                             type = col_factor(),
                                             ppid = col_factor(),
                                             exp_label = col_factor(),
                                             experiment = col_factor(),
                                             hand = col_factor(),
                                             camera_tilt = col_factor(),
                                             surface_tilt = col_factor(),
                                             target = col_factor(),
                                             surface = col_factor(),
                                             anim_type = col_factor()))

1 Visualizing data (univariate)

test_ppt <- 3

test_df <- omnibus_df %>% filter(ppid == test_ppt)


trial <- 250
trial_df <- filter(test_df, trial_num == trial)

x <- trial_df$flick_velocity_x
y <- trial_df$flick_velocity_y
z <- trial_df$flick_velocity_z

x2 <- trial_df$flick_direction_x
y2 <- trial_df$flick_direction_y
z2 <- trial_df$flick_direction_z

# plot both
plot_ly(x = c(0, x), y = c(0, y), z = c(0, z), type = "scatter3d", mode = "lines") %>%
  add_trace(x = c(0, x2), y = c(0, y2), z = c(0, z2), type = "scatter3d", mode = "lines") %>%
  layout(scene = list(xaxis = list(title = "x"),
                      yaxis = list(title = "y"),
                      zaxis = list(title = "z")))

# note: this is a rotated trial

2 Group

2.1 All throws

# try just animate_surface exp
animate_surface_trial_summary_df <- omnibus_df %>%
  filter(exp_label == "animate_surface") %>%
  group_by(trial_num) %>%
  summarise(
    mean_deviation = mean(throw_deviation),
    ci_deviation = vector_confint(throw_deviation)
  )

data <- animate_surface_trial_summary_df

# set up plot
p <- data %>%
  ggplot(
    aes(
      x = trial_num, y = mean_deviation
    )
  ) +
  theme_classic() +
  theme(legend.position = "none") +
  labs(
    x = "Trial Number",
    y = "Throw Angle (°)"
  )

# add horizontal lines
p <- p +
  geom_hline(
    yintercept = c(0, -30), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "solid"
  ) +
  geom_hline(
    yintercept = c(-15), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "dashed"
  )

# p <- p +
#   scale_y_continuous(
#     limits = c(-10, 35),
#     breaks = c(0, 15, 30),
#     labels = c(0, 15, 30)
#   ) +
#   scale_x_continuous(
#     limits = c(0, 180),
#     breaks = c(0, 60, 120, 180),
#     labels = c(0, 60, 120, 180)
#   )

# set font size to 11
p <- p +
  theme(text = element_text(size = 11))

# add confidence intervals
p <- p + geom_ribbon(
  aes(
    ymin = mean_deviation - ci_deviation,
    ymax = mean_deviation + ci_deviation
  ),
  fill = "#d40000", colour = NA, alpha = 0.3
  )


# add data
p <- p + geom_line(colour = "#d40000")


# # save
# if (save_plots) {
#   ggsave(
#   p,
#   filename = "../plots/paper_figs/sr_30_training.pdf", device = "pdf",
#   height = 4, width = 6
#   )
#   }

# ggplotly(p)
p

# rest of the exps
original_exps_trial_summary_df <- omnibus_df %>%
  filter(exp_label == "original_exps") %>%
  group_by(experiment, trial_num) %>%
  summarise(
    mean_deviation = mean(throw_deviation),
    ci_deviation = vector_confint(throw_deviation)
  )
`summarise()` has grouped output by 'experiment'. You can override using the `.groups` argument.
data <- original_exps_trial_summary_df

# set up plot
p <- data %>%
  ggplot(
    aes(
      x = trial_num, y = mean_deviation, colour = experiment
    )
  ) +
  theme_classic() +
  theme(legend.position = "none") +
  labs(
    x = "Trial Number",
    y = "Throw Angle (°)"
  )

# add horizontal lines
p <- p +
  geom_hline(
    yintercept = c(0, -30), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "solid"
  ) +
  geom_hline(
    yintercept = c(-15), linewidth = 0.4,
    colour = "#CCCCCC", linetype = "dashed"
  )

# p <- p +
#   scale_y_continuous(
#     limits = c(-10, 35),
#     breaks = c(0, 15, 30),
#     labels = c(0, 15, 30)
#   ) +
#   scale_x_continuous(
#     limits = c(0, 180),
#     breaks = c(0, 60, 120, 180),
#     labels = c(0, 60, 120, 180)
#   )

# set font size to 11
p <- p +
  theme(text = element_text(size = 11))

# add confidence intervals
p <- p + geom_ribbon(
  aes(
    ymin = mean_deviation - ci_deviation,
    ymax = mean_deviation + ci_deviation,
    fill = experiment
  ), colour = NA, alpha = 0.3
  )


# add data
p <- p + geom_line()


# # save
# if (save_plots) {
#   ggsave(
#   p,
#   filename = "../plots/paper_figs/sr_30_training.pdf", device = "pdf",
#   height = 4, width = 6
#   )
#   }

# ggplotly(p)
p

Plot all the trials and see if there are group effects.

all_throw_summary <- omnibus_df %>%
  group_by(experiment, trial_num) %>%
  summarise(mean = mean(error_size, na.rm = TRUE),
            sd = sd(error_size, na.rm = TRUE), 
            ci = vector_confint(error_size),
            n = n(), .groups = "drop")
p <- omnibus_df %>%
  ggplot(aes(x = trial_num, y = error_size)) +
  # geom_point(alpha = 0.04, aes(colour = experiment)) + 
  geom_ribbon(data = all_throw_summary, 
                 aes(y = mean, ymin = mean-ci,
                     ymax = mean+ci, fill = experiment), 
              alpha = 0.3) +
  geom_line(data = all_throw_summary, 
            aes(y = mean, colour = experiment)) +
  theme_minimal() +
  # scale_x_continuous(limits = c(205, 374)) +
  NULL

# ggplotly(p)
p
# save plot
# ggsave(p, height = 9, width = 16, device = "svg", filename = "data/figs/all_throws.svg")

2.2 Success manifolds

2.2.1 Without any tilts

# ggplotly(plot_success_manifold_no_tilt())
plot_success_manifold_no_tilt()

2.2.2 With tilt present

ggplotly(plot_success_manifold_tilt())
LS0tDQp0aXRsZTogIkJpbGxpYXJkcyBhbmQgVGlsdHMgQW5hbHlzaXMgTm90ZWJvb2siDQphdXRob3I6ICJTaGFuYWF0aGFuYW4gTW9kY2hhbGluZ2FtIg0KZGF0ZTogIkRlYyAwNiwgMjAyMSINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpybShsaXN0ID0gbHMoKSkgICAgICAjIGNsZWFuIGVudmlyb25tZW50DQoNCnNvdXJjZSgiLi4vc3JjL2hlbHBlcl9mdW5jcy5SIikNCnNvdXJjZSgiLi4vc2NyaXB0cy9maWd1cmVfZnVuY3MuUiIpIA0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdnYmVlc3dhcm0pDQpsaWJyYXJ5KGV6KSAjZm9yIEFOT1ZBcw0KbGlicmFyeShlZmZlY3RzaXplKSAjIGZvciBldGEtc3F1YXJlZA0KbGlicmFyeShwbG90bHkpDQoNCmBgYA0KDQoNCg0KIyMgTG9hZCBhbGwgb2YgdGhlIHRocm93IGRhdGENCg0KDQoNCmBgYHtyfQ0KI2xvYWQgb21uaWJ1cyBkYXRhZnJhbWUNCm9tbmlidXNfZGYgPC0gcmVhZF9kZWxpbSgiLi4vZGF0YS9wcm9jZXNzZWQvb21uaWJ1cy9vbW5pYnVzX3Jhdy5jc3YiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICIsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyguZGVmYXVsdCA9IGNvbF9kb3VibGUoKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gY29sX2ZhY3RvcigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBpZCA9IGNvbF9mYWN0b3IoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cF9sYWJlbCA9IGNvbF9mYWN0b3IoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnQgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kID0gY29sX2ZhY3RvcigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX3RpbHQgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlX3RpbHQgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBjb2xfZmFjdG9yKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlID0gY29sX2ZhY3RvcigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbV90eXBlID0gY29sX2ZhY3RvcigpKSkNCmBgYA0KDQojIFZpc3VhbGl6aW5nIGRhdGEgKHVuaXZhcmlhdGUpDQoNCmBgYHtyfQ0KdGVzdF9wcHQgPC0gMw0KDQp0ZXN0X2RmIDwtIG9tbmlidXNfZGYgJT4lIGZpbHRlcihwcGlkID09IHRlc3RfcHB0KQ0KDQoNCnRyaWFsIDwtIDI1MA0KdHJpYWxfZGYgPC0gZmlsdGVyKHRlc3RfZGYsIHRyaWFsX251bSA9PSB0cmlhbCkNCg0KeCA8LSB0cmlhbF9kZiRmbGlja192ZWxvY2l0eV94DQp5IDwtIHRyaWFsX2RmJGZsaWNrX3ZlbG9jaXR5X3kNCnogPC0gdHJpYWxfZGYkZmxpY2tfdmVsb2NpdHlfeg0KDQp4MiA8LSB0cmlhbF9kZiRmbGlja19kaXJlY3Rpb25feA0KeTIgPC0gdHJpYWxfZGYkZmxpY2tfZGlyZWN0aW9uX3kNCnoyIDwtIHRyaWFsX2RmJGZsaWNrX2RpcmVjdGlvbl96DQoNCiMgcGxvdCBib3RoDQpwbG90X2x5KHggPSBjKDAsIHgpLCB5ID0gYygwLCB5KSwgeiA9IGMoMCwgeiksIHR5cGUgPSAic2NhdHRlcjNkIiwgbW9kZSA9ICJsaW5lcyIpICU+JQ0KICBhZGRfdHJhY2UoeCA9IGMoMCwgeDIpLCB5ID0gYygwLCB5MiksIHogPSBjKDAsIHoyKSwgdHlwZSA9ICJzY2F0dGVyM2QiLCBtb2RlID0gImxpbmVzIikgJT4lDQogIGxheW91dChzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gIngiKSwNCiAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAieSIpLA0KICAgICAgICAgICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJ6IikpKQ0KDQojIG5vdGU6IHRoaXMgaXMgYSByb3RhdGVkIHRyaWFsDQpgYGANCg0KYGBge3J9DQoNCmBgYA0KDQoNCiMgR3JvdXAgDQoNCiMjIEFsbCB0aHJvd3MNCg0KYGBge3J9DQojIHRyeSBqdXN0IGFuaW1hdGVfc3VyZmFjZSBleHANCmFuaW1hdGVfc3VyZmFjZV90cmlhbF9zdW1tYXJ5X2RmIDwtIG9tbmlidXNfZGYgJT4lDQogIGZpbHRlcihleHBfbGFiZWwgPT0gImFuaW1hdGVfc3VyZmFjZSIpICU+JQ0KICBncm91cF9ieSh0cmlhbF9udW0pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVhbl9kZXZpYXRpb24gPSBtZWFuKHRocm93X2RldmlhdGlvbiksDQogICAgY2lfZGV2aWF0aW9uID0gdmVjdG9yX2NvbmZpbnQodGhyb3dfZGV2aWF0aW9uKQ0KICApDQoNCmRhdGEgPC0gYW5pbWF0ZV9zdXJmYWNlX3RyaWFsX3N1bW1hcnlfZGYNCg0KIyBzZXQgdXAgcGxvdA0KcCA8LSBkYXRhICU+JQ0KICBnZ3Bsb3QoDQogICAgYWVzKA0KICAgICAgeCA9IHRyaWFsX251bSwgeSA9IG1lYW5fZGV2aWF0aW9uDQogICAgKQ0KICApICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoDQogICAgeCA9ICJUcmlhbCBOdW1iZXIiLA0KICAgIHkgPSAiVGhyb3cgQW5nbGUgKMKwKSINCiAgKQ0KDQojIGFkZCBob3Jpem9udGFsIGxpbmVzDQpwIDwtIHAgKw0KICBnZW9tX2hsaW5lKA0KICAgIHlpbnRlcmNlcHQgPSBjKDAsIC0zMCksIGxpbmV3aWR0aCA9IDAuNCwNCiAgICBjb2xvdXIgPSAiI0NDQ0NDQyIsIGxpbmV0eXBlID0gInNvbGlkIg0KICApICsNCiAgZ2VvbV9obGluZSgNCiAgICB5aW50ZXJjZXB0ID0gYygtMTUpLCBsaW5ld2lkdGggPSAwLjQsDQogICAgY29sb3VyID0gIiNDQ0NDQ0MiLCBsaW5ldHlwZSA9ICJkYXNoZWQiDQogICkNCg0KIyBwIDwtIHAgKw0KIyAgIHNjYWxlX3lfY29udGludW91cygNCiMgICAgIGxpbWl0cyA9IGMoLTEwLCAzNSksDQojICAgICBicmVha3MgPSBjKDAsIDE1LCAzMCksDQojICAgICBsYWJlbHMgPSBjKDAsIDE1LCAzMCkNCiMgICApICsNCiMgICBzY2FsZV94X2NvbnRpbnVvdXMoDQojICAgICBsaW1pdHMgPSBjKDAsIDE4MCksDQojICAgICBicmVha3MgPSBjKDAsIDYwLCAxMjAsIDE4MCksDQojICAgICBsYWJlbHMgPSBjKDAsIDYwLCAxMjAsIDE4MCkNCiMgICApDQoNCiMgc2V0IGZvbnQgc2l6ZSB0byAxMQ0KcCA8LSBwICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKQ0KDQojIGFkZCBjb25maWRlbmNlIGludGVydmFscw0KcCA8LSBwICsgZ2VvbV9yaWJib24oDQogIGFlcygNCiAgICB5bWluID0gbWVhbl9kZXZpYXRpb24gLSBjaV9kZXZpYXRpb24sDQogICAgeW1heCA9IG1lYW5fZGV2aWF0aW9uICsgY2lfZGV2aWF0aW9uDQogICksDQogIGZpbGwgPSAiI2Q0MDAwMCIsIGNvbG91ciA9IE5BLCBhbHBoYSA9IDAuMw0KICApDQoNCg0KIyBhZGQgZGF0YQ0KcCA8LSBwICsgZ2VvbV9saW5lKGNvbG91ciA9ICIjZDQwMDAwIikNCg0KDQojICMgc2F2ZQ0KIyBpZiAoc2F2ZV9wbG90cykgew0KIyAgIGdnc2F2ZSgNCiMgICBwLA0KIyAgIGZpbGVuYW1lID0gIi4uL3Bsb3RzL3BhcGVyX2ZpZ3Mvc3JfMzBfdHJhaW5pbmcucGRmIiwgZGV2aWNlID0gInBkZiIsDQojICAgaGVpZ2h0ID0gNCwgd2lkdGggPSA2DQojICAgKQ0KIyAgIH0NCg0KIyBnZ3Bsb3RseShwKQ0KcA0KYGBgDQoNCg0KDQpgYGB7cn0NCiMgcmVzdCBvZiB0aGUgZXhwcw0Kb3JpZ2luYWxfZXhwc190cmlhbF9zdW1tYXJ5X2RmIDwtIG9tbmlidXNfZGYgJT4lDQogIGZpbHRlcihleHBfbGFiZWwgPT0gIm9yaWdpbmFsX2V4cHMiKSAlPiUNCiAgZ3JvdXBfYnkoZXhwZXJpbWVudCwgdHJpYWxfbnVtKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG1lYW5fZGV2aWF0aW9uID0gbWVhbih0aHJvd19kZXZpYXRpb24pLA0KICAgIGNpX2RldmlhdGlvbiA9IHZlY3Rvcl9jb25maW50KHRocm93X2RldmlhdGlvbikNCiAgKQ0KDQpkYXRhIDwtIG9yaWdpbmFsX2V4cHNfdHJpYWxfc3VtbWFyeV9kZg0KDQojIHNldCB1cCBwbG90DQpwIDwtIGRhdGEgJT4lDQogIGdncGxvdCgNCiAgICBhZXMoDQogICAgICB4ID0gdHJpYWxfbnVtLCB5ID0gbWVhbl9kZXZpYXRpb24sIGNvbG91ciA9IGV4cGVyaW1lbnQNCiAgICApDQogICkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgbGFicygNCiAgICB4ID0gIlRyaWFsIE51bWJlciIsDQogICAgeSA9ICJUaHJvdyBBbmdsZSAowrApIg0KICApDQoNCiMgYWRkIGhvcml6b250YWwgbGluZXMNCnAgPC0gcCArDQogIGdlb21faGxpbmUoDQogICAgeWludGVyY2VwdCA9IGMoMCwgLTMwKSwgbGluZXdpZHRoID0gMC40LA0KICAgIGNvbG91ciA9ICIjQ0NDQ0NDIiwgbGluZXR5cGUgPSAic29saWQiDQogICkgKw0KICBnZW9tX2hsaW5lKA0KICAgIHlpbnRlcmNlcHQgPSBjKC0xNSksIGxpbmV3aWR0aCA9IDAuNCwNCiAgICBjb2xvdXIgPSAiI0NDQ0NDQyIsIGxpbmV0eXBlID0gImRhc2hlZCINCiAgKQ0KDQojIHAgPC0gcCArDQojICAgc2NhbGVfeV9jb250aW51b3VzKA0KIyAgICAgbGltaXRzID0gYygtMTAsIDM1KSwNCiMgICAgIGJyZWFrcyA9IGMoMCwgMTUsIDMwKSwNCiMgICAgIGxhYmVscyA9IGMoMCwgMTUsIDMwKQ0KIyAgICkgKw0KIyAgIHNjYWxlX3hfY29udGludW91cygNCiMgICAgIGxpbWl0cyA9IGMoMCwgMTgwKSwNCiMgICAgIGJyZWFrcyA9IGMoMCwgNjAsIDEyMCwgMTgwKSwNCiMgICAgIGxhYmVscyA9IGMoMCwgNjAsIDEyMCwgMTgwKQ0KIyAgICkNCg0KIyBzZXQgZm9udCBzaXplIHRvIDExDQpwIDwtIHAgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpDQoNCiMgYWRkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQpwIDwtIHAgKyBnZW9tX3JpYmJvbigNCiAgYWVzKA0KICAgIHltaW4gPSBtZWFuX2RldmlhdGlvbiAtIGNpX2RldmlhdGlvbiwNCiAgICB5bWF4ID0gbWVhbl9kZXZpYXRpb24gKyBjaV9kZXZpYXRpb24sDQogICAgZmlsbCA9IGV4cGVyaW1lbnQNCiAgKSwgY29sb3VyID0gTkEsIGFscGhhID0gMC4zDQogICkNCg0KDQojIGFkZCBkYXRhDQpwIDwtIHAgKyBnZW9tX2xpbmUoKQ0KDQoNCiMgIyBzYXZlDQojIGlmIChzYXZlX3Bsb3RzKSB7DQojICAgZ2dzYXZlKA0KIyAgIHAsDQojICAgZmlsZW5hbWUgPSAiLi4vcGxvdHMvcGFwZXJfZmlncy9zcl8zMF90cmFpbmluZy5wZGYiLCBkZXZpY2UgPSAicGRmIiwNCiMgICBoZWlnaHQgPSA0LCB3aWR0aCA9IDYNCiMgICApDQojICAgfQ0KDQojIGdncGxvdGx5KHApDQpwDQpgYGANCg0KDQoNCg0KDQoNClBsb3QgYWxsIHRoZSB0cmlhbHMgYW5kIHNlZSBpZiB0aGVyZSBhcmUgZ3JvdXAgZWZmZWN0cy4NCmBgYHtyfQ0KYWxsX3Rocm93X3N1bW1hcnkgPC0gb21uaWJ1c19kZiAlPiUNCiAgZ3JvdXBfYnkoZXhwZXJpbWVudCwgdHJpYWxfbnVtKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGVycm9yX3NpemUsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBzZCA9IHNkKGVycm9yX3NpemUsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgY2kgPSB2ZWN0b3JfY29uZmludChlcnJvcl9zaXplKSwNCiAgICAgICAgICAgIG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpDQpgYGANCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD05LjV9DQpwIDwtIG9tbmlidXNfZGYgJT4lDQogIGdncGxvdChhZXMoeCA9IHRyaWFsX251bSwgeSA9IGVycm9yX3NpemUpKSArDQogICMgZ2VvbV9wb2ludChhbHBoYSA9IDAuMDQsIGFlcyhjb2xvdXIgPSBleHBlcmltZW50KSkgKyANCiAgZ2VvbV9yaWJib24oZGF0YSA9IGFsbF90aHJvd19zdW1tYXJ5LCANCiAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbi1jaSwNCiAgICAgICAgICAgICAgICAgICAgIHltYXggPSBtZWFuK2NpLCBmaWxsID0gZXhwZXJpbWVudCksIA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuMykgKw0KICBnZW9tX2xpbmUoZGF0YSA9IGFsbF90aHJvd19zdW1tYXJ5LCANCiAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgY29sb3VyID0gZXhwZXJpbWVudCkpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgIyBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDUsIDM3NCkpICsNCiAgTlVMTA0KDQojIGdncGxvdGx5KHApDQpwDQojIHNhdmUgcGxvdA0KIyBnZ3NhdmUocCwgaGVpZ2h0ID0gOSwgd2lkdGggPSAxNiwgZGV2aWNlID0gInN2ZyIsIGZpbGVuYW1lID0gImRhdGEvZmlncy9hbGxfdGhyb3dzLnN2ZyIpDQpgYGANCg0KIyMgU3VjY2VzcyBtYW5pZm9sZHMNCiMjIyBXaXRob3V0IGFueSB0aWx0cw0KYGBge3IsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTIwfQ0KIyBnZ3Bsb3RseShwbG90X3N1Y2Nlc3NfbWFuaWZvbGRfbm9fdGlsdCgpKQ0KcGxvdF9zdWNjZXNzX21hbmlmb2xkX25vX3RpbHQoKQ0KYGBgDQoNCiMjIyBXaXRoIHRpbHQgcHJlc2VudA0KYGBge3IsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTIwfQ0KZ2dwbG90bHkocGxvdF9zdWNjZXNzX21hbmlmb2xkX3RpbHQoKSkNCmBgYA0KDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KTlVMTA0KYGBgDQoNCg==